#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <vector>




void* handlerTask(void* arg)
{
    std::string threadname = static_cast<char*>(arg);
    while(true)
    {
        sleep(1);
        std::cout << threadname << " is running " << std::endl;
    }
    return nullptr;
}

// 多线程的创建
int main()
{
    std::vector<pthread_t> threads;
    for(int i=0;i<5;i++)
    {
        char* threadname = new char[64];
        snprintf(threadname, 64, "Thread-%d", i+1);
        pthread_t tid;
        pthread_create(&tid, nullptr, handlerTask, threadname);
        threads.push_back(tid);
    }
    for(auto & e : threads)
    {
        pthread_join(e, nullptr);
    }
    return 0;
}






// void* handlerTask(void* arg)
// {
//     // 其实这里拿到的是外部的缓冲区，而不是一个单单的字符串
//     // 则最后创建的线程可以覆盖这个缓冲区的内容，导致基本上所有的线程的名字都是5号线程
//     std::string threadname = static_cast<char*>(arg);
//     while(true)
//     {
//         sleep(1);
//         std::cout << threadname << " is running " << std::endl;
//     }
//     return nullptr;
// }

// // 多线程的创建
// int main()
// {
//     std::vector<pthread_t> threads;
//     for(int i=0;i<5;i++)
//     {
//         char threadname[12];
//         snprintf(threadname, sizeof(threadname), "Thread-%d", i+1);
//         pthread_t tid;
//         pthread_create(&tid, nullptr, handlerTask, threadname);
//         threads.push_back(tid);
//     }
//     for(auto & e : threads)
//     {
//         pthread_join(e, nullptr);
//     }
//     return 0;
// }



// std::string ToHex(pthread_t tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }

// void *newthreadrun(void *arg)
// {
//     std::string threadname = (char *)arg;
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << threadname << " is running: " << cnt << ", pid : " << getpid()
//                   << ", my thread tid : " << ToHex(pthread_self()) << std::endl;

//         sleep(1);
//     }

//     pthread_exit((void*)123);

//     // return (void*)123;
// }
// int main()
// {
//     pthread_t tid;
//     //           输出型参数：接收返回回来的内容     传输给线程的参数 
//     pthread_create(&tid, nullptr, newthreadrun, (void *)"thread-1");

//     sleep(2);
//     pthread_cancel(tid);
    
//     void* ret = nullptr;
//     int n = pthread_join(tid, &ret);

//     std::cout << "main thread quit, n : " << n << ", ret : " << (long long)ret << std::endl;
//     sleep(5);

//     // int cnt = 10;
//     // while (cnt--)
//     // {
//     //     std::cout << "main thread is running: " << cnt << ", pid : " << getpid()
//     //               << " new thread tid : " << ToHex(tid)
//     //               << ", main thread tid : " << ToHex(pthread_self()) << std::endl;
//     //     sleep(1);
//     // }
//     return 0;
// }